home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 79 / maccd 79.iso / multimedial / GL Tron / Source / gltron / camera.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-05-16  |  3.3 KB  |  124 lines  |  [TEXT/CWIE]

  1. #include "gltron.h"
  2.  
  3. static float cam_park_pos[4][2] = {
  4.   { 0.2, 0.2 },
  5.   { 0.8, 0.2 },
  6.   { 0.2, 0.8 },
  7.   { 0.8, 0.8 }
  8. };
  9.  
  10. static float park_height = 80.0;
  11.  
  12. void chaseCamMove() {
  13.   int i;
  14.   Camera *cam;
  15.   Data *data;
  16.   float dest[3];
  17.   float tdest[3];
  18.   float dcamx;
  19.   float dcamy;
  20.   float d, dt;
  21.  
  22.   dt = game2->time.dt;
  23.  
  24.   for(i = 0; i < game->players; i++) {
  25.       
  26.     cam = game->player[i].camera;
  27.     data = game->player[i].data;
  28.     
  29.     if(data->speed == SPEED_GONE) {
  30.       float tmp[3];
  31.     
  32.       dest[0] = cam_park_pos[i][0] * game->settings->grid_size;
  33.       dest[1] = cam_park_pos[i][1] * game->settings->grid_size;
  34.     
  35.       dest[2] = park_height;
  36.       tdest[0] = game->settings->grid_size / 2;
  37.       tdest[1] = game->settings->grid_size / 2;
  38.       tdest[2] = -10;
  39.       vsub(dest, cam->cam, tmp);
  40.       if(length(tmp) > 1) {
  41.     normalize(tmp);
  42.     vadd(cam->cam, tmp, cam->cam);
  43.       } else
  44.     vcopy(dest, cam->cam);
  45.       vsub(tdest, cam->target, tmp);
  46.       if(length(tmp) > 1) {
  47.     normalize(tmp);
  48.     vadd(cam->target, tmp, cam->target);
  49.       } else 
  50.     vcopy(tdest, cam->target);
  51.     } else {
  52.       
  53.       switch(cam->camType) {
  54.       case CAM_TYPE_CIRCLING: /* Andi-cam */
  55.     cam->cam[0] = data->posx + CAM_CIRCLE_DIST * COS(camAngle);
  56.     cam->cam[1] = data->posy + CAM_CIRCLE_DIST * SIN(camAngle);
  57.     cam->cam[2] = CAM_CIRCLE_Z;
  58.     cam->target[0] = data->posx;
  59.     cam->target[1] = data->posy;
  60.     cam->target[2] = B_HEIGHT;
  61.     break;
  62.       case CAM_TYPE_FOLLOW: /* Mike-cam */
  63.     cam->target[0] = data->posx;
  64.     cam->target[1] = data->posy;
  65.     cam->target[2] = B_HEIGHT;
  66.       
  67.     dest[0] = cam->target[0] - CAM_FOLLOW_DIST * dirsX[ data->dir];
  68.     dest[1] = cam->target[1] - CAM_FOLLOW_DIST * dirsY[ data->dir];
  69.  
  70.     d = sqrt((dest[0] - cam->cam[0]) * (dest[0] - cam->cam[0]) +
  71.          (dest[1] - cam->cam[1]) * (dest[1] - cam->cam[1]));
  72.     if(d != 0) {
  73.       /*
  74.         dcamx = (float)dt * CAM_FOLLOW_SPEED * (dest[0] - cam->cam[0]) / d;
  75.         dcamy = (float)dt * CAM_FOLLOW_SPEED * (dest[1] - cam->cam[1]) / d;
  76.       */
  77.       dcamx = (float)dt * CAM_FOLLOW_SPEED_FACTOR *
  78.         game->settings->current_speed * (dest[0] - cam->cam[0]) / d;
  79.       dcamy = (float)dt * CAM_FOLLOW_SPEED_FACTOR *
  80.         game->settings->current_speed * (dest[1] - cam->cam[1]) / d;
  81.  
  82.       if((dest[0] - cam->cam[0] > 0 && dest[0] - cam->cam[0] < dcamx) ||
  83.          (dest[0] - cam->cam[0] < 0 && dest[0] - cam->cam[0] > dcamx)) {
  84.         cam->cam[0] = dest[0];
  85.       } else cam->cam[0] += dcamx;
  86.  
  87.       if((dest[1] - cam->cam[1] > 0 && dest[1] - cam->cam[1] < dcamy) ||
  88.          (dest[1] - cam->cam[1] < 0 && dest[1] - cam->cam[1] > dcamy)) {
  89.         cam->cam[1] = dest[1];
  90.       } else cam->cam[1] += dcamy;
  91.     }
  92.     break;
  93.       case CAM_TYPE_COCKPIT: /* 1st person */
  94.     cam->target[0] = data->posx + dirsX[data->dir];
  95.     cam->target[1] = data->posy + dirsY[data->dir];
  96.     cam->target[2] = CAM_COCKPIT_Z;
  97.  
  98.     cam->cam[0] = data->posx;
  99.     cam->cam[1] = data->posy;
  100.     cam->cam[2] = CAM_COCKPIT_Z + 0.5;
  101.     break;
  102.       case CAM_TYPE_MOUSE: /* mouse camera */
  103.     cam->target[0] = data->posx + dirsX[data->dir];
  104.     cam->target[1] = data->posy + dirsY[data->dir];
  105.     cam->target[2] = B_HEIGHT;
  106.  
  107.     cam->cam[0] = data->posx + 
  108.       cam_r * cos(cam_phi) * sin(cam_chi);
  109.     cam->cam[1] = data->posy + 
  110.       cam_r * sin(cam_phi) * sin(cam_chi);
  111.     cam->cam[2] = cam_r * cos(cam_chi);
  112.     break;
  113.       }
  114.     }
  115.   }
  116. }
  117.  
  118. void camMove() {
  119.   camAngle += CAM_SPEED * game2->time.dt / 100;
  120.   while(camAngle > 360) camAngle -= 360;
  121. }
  122.  
  123.  
  124.